﻿using System;
using System.Reflection;
using System.Collections.Generic;
using System.Data;
using System.Text;
using Comm.PublicClass;
using WsProtocol.PublicClass;
using WsProtocol.IEC62056;
using System.Runtime.Serialization;
using System.Linq;

namespace WsProtocol.IEC62056MDL
{
    //对象定义
    [DataContract]
    public class ProObject : ProNodeBase
    {
        private static string ptltable = "T_Objects";
        private static DataTable dtAll = null;  //所有数据
        //private static List<ProObject> Objectlst = null;  //对象列表
        private static Dictionary<string, ProObject> Objectlst = null;  //对象列表

        private static List<string> OjbGroupLst = new List<string>();  //对象分组列表

        #region 语言相关的字段
        public string BaseObName { get; set; }        
        public string BaseDescs { get; set; }
        #endregion

        private string obname = string.Empty;
        private string ifInteroir = "0";  //是否是厂内参数
        private string ifStandard = "1"; //是否为标准OBIS
        private int meterhas = 0;
        public string OBIS { get; set; }
        public string ObName
        {
            get { return obname; }
            set
            {
                obname = value;
                ProName = value;
            }
        }
        //public string ClassID { get; set; }     
        public ProIClass proClass;  //所属类
        public string Descs { get; set; }
        public bool IfParent { get; set; }
        public string seq { get; set; }
        public bool IfInteroir
        {
            get { return ifInteroir == "1"; }
            set { ifInteroir = value ? "1" : "0"; }
        }    //是否是厂内参数
        public bool IfStandard
        {
            get { return ifStandard == "1"; }
            set
            {
                if (value)
                    ifStandard = "1";
                else
                    ifStandard = "0";
            }
        }   
        public ProObject ParentObj { get; set; }  //父对象
        public string ObjGroup { get; set; }  //对象分组  用于区分哪种表  如埃及表、欧盟表等


        public List<ProObject> ObjLst { get; set; }  //下级对象列表
        public List<ProObAttr> AttrLst { get; set; } //属性&方法列表
        public object TreeNode;  //对应的树节点 

        public MeterHas meterHas {
            get { return (MeterHas)meterhas; }
            set { meterhas = (int)value; }
        }

        public ProObject()
        {
            BaseObName = string.Empty;           
            BaseDescs = string.Empty;            
            
            Descs = string.Empty;
           // ClassID = string.Empty;           
            seq = string.Empty;
            ObjGroup = string.Empty;

            ObjLst = new List<ProObject>();
            AttrLst = new List<ProObAttr>();
            ParentObj = null;
            checkState = CheckState.Unchecked;
            ifStandard = "0";
            proClass = new ProIClass();
        }

        protected override void Dispose(bool disposing)
        {
            Objectlst.Remove(this.ID);
            if (this.ParentObj != null)
                this.ParentObj.EleLst.Remove(this);
        }

        //根据父类获取对应Object
        public void GetObjectByPObj()
        {
            ObjLst.Clear();
            //for (int i = 0; i < Objectlst.Count; i++)
            foreach (string id in Objectlst.Keys)
            {
                if (Objectlst[id].PID == ID)
                {
                    this.AddSon(Objectlst[id]);
                }
            }
        }

        //获取下级对象
        public void GetSonObj()
        {
            if (this.IfParent)
            {
                GetObjectByPObj();
                for (int i = 0; i < this.ObjLst.Count; i++)
                    this.ObjLst[i].GetSonObj();
            }
        }

        /// <summary>
        /// 添加子节点
        /// </summary>
        /// <param name="sonattr"></param>
        public void AddSon(ProObject sonobj)
        {
            if (sonobj == null || ObjLst.IndexOf(sonobj) >= 0)
                return;
            ObjLst.Add(sonobj);
            sonobj.ParentObj = this;
            sonobj.PID = this.ID;
            IfParent = true;
        }


        /// <summary>
        /// 移除子节点
        /// </summary>
        /// <param name="sonattr"></param>
        public void RemoveSon(ProObject sonobj)
        {
            if (sonobj == null)
                return;
            sonobj.ParentObj = null;
            ObjLst.Remove(sonobj);
            IfParent = ObjLst.Count > 0;
        }

        /// <summary>
        /// 清空子节点
        /// </summary>
        public void ClearSon()
        {
            ObjLst.Clear();
            IfParent = false;
        }

        /// <summary>
        /// 替换子节点
        /// </summary>
        /// <param name="sonattr"></param>
        /// <param name="newson"></param>
        public void ReplaceSon(ProObject sonobj, ProObject newson)
        {
            if (sonobj == null || newson == null)
                return;
            int index = ObjLst.IndexOf(sonobj);
            if (index >= 0)
            {
                ObjLst[index].ParentObj = null;
                ObjLst[index] = newson;
                newson.ParentObj = this;
            }
        }

        //复制自身
        public ProObject Copy()
        {            
            //新建一个
            ProObject newobj = new ProObject();

            //复 制属性
            PropertyInfo[] fromFields = typeof(ProObject).GetProperties();
            PubFunction.SetProperties(fromFields, this, newobj);


            //复制下级节点列表
            newobj.ObjLst = new List<ProObject>();
            for (int i = 0; i < this.ObjLst.Count; i++)
            {
                ProObject newson = this.ObjLst[i].Copy();
                newson.checkState = CheckState.Unchecked;
                newson.ParentObj = newobj;
                newobj.ObjLst.Add(newson);
            }


            //复制属性列表
            newobj.AttrLst = new List<ProObAttr>();
            for (int i = 0; i < this.AttrLst.Count; i++)
            {
                ProObAttr newattr = this.AttrLst[i].Copy();
                newattr.checkState = CheckState.Unchecked;
                newattr.proObject = newobj;
                newobj.AttrLst.Add(newattr);
            }


            return newobj;
        }

        /// <summary>
        /// 检查属性列表中是否有选中的  并同步更改自身的选中状态
        /// </summary>
        public void IfAttrChecked(bool checkson)
        {
            bool ifcheck = false;
            for (int i = 0; i < this.AttrLst.Count; i++)
            {
                if (this.AttrLst[i].checkState == CheckState.Checked)
                {
                    ifcheck = true;
                    break;
                }
            }
            SetObjCheckStatus(ifcheck, true, checkson);

        }

        /// <summary>
        /// 设置各级节点的选中状态  不管属性状态
        /// </summary>
        /// <param name="anode">当前操作的节点</param>
        /// <param name="ifcheck">是否选中</param>
        /// <param name="checkparent">是否更新父节点状态</param>
        public void SetObjCheckStatus(bool acheck, bool checkparent, bool checkson)
        {
            if (acheck)
            {
                this.checkState = CheckState.Checked;

                if (checkson)
                {
                    for (int i = 0; i < this.ObjLst.Count; i++)
                        this.ObjLst[i].SetCheckStatus(true, false, checkson);
                }
                if (checkparent)
                {
                    ProObject pnode = this.ParentObj;
                    while (pnode != null)
                    {
                        pnode.checkState = CheckState.Checked;
                        pnode = pnode.ParentObj;
                    }
                }
            }
            else
            {
                this.checkState = CheckState.Unchecked;

                if (checkson)
                {
                    for (int i = 0; i < this.ObjLst.Count; i++)
                        this.ObjLst[i].SetCheckStatus(false, false, checkson);
                }

                if (checkparent)
                {
                    ProObject pnode = this.ParentObj;
                    while (pnode != null)
                    {
                        pnode.checkState = CheckState.Unchecked;

                        //检查子类对象中是否有选中的
                        for (int j = 0; j < pnode.ObjLst.Count; j++)
                        {
                            if (pnode.ObjLst[j].checkState == CheckState.Checked)
                            {
                                pnode.checkState = CheckState.Checked;
                                break;
                            }
                        }

                        pnode = pnode.ParentObj;
                    }
                }
            }
        }


        /// <summary>
        /// 设置各级节点的选中状态
        /// </summary>
        /// <param name="anode">当前操作的节点</param>
        /// <param name="ifcheck">是否选中</param>
        /// <param name="checkparent">是否更新父节点状态</param>
        public override void SetCheckStatus(bool acheck, bool checkparent)
        {
            SetCheckStatus(acheck, checkparent, true);
        }

        /// <summary>
        /// 设置各级节点的选中状态
        /// </summary>
        /// <param name="anode">当前操作的节点</param>
        /// <param name="ifcheck">是否选中</param>
        /// <param name="checkparent">是否更新父节点状态</param>
        public override void SetCheckStatus(bool acheck, bool checkparent, bool checkson)
        {
            if (acheck)
            {
                this.checkState = CheckState.Checked;

                if (checkson)
                {
                    for (int i = 0; i < this.ObjLst.Count; i++)
                        this.ObjLst[i].SetCheckStatus(true, false, checkson);

                    for (int i = 0; i < this.AttrLst.Count; i++)
                        this.AttrLst[i].SetCheckStatus(true, false, checkson);
                }

                if (checkparent)
                {
                    ProObject pnode = this.ParentObj;
                    while (pnode != null)
                    {
                        pnode.checkState = CheckState.Checked;
                        pnode = pnode.ParentObj;
                    }
                }
            }
            else
            {
                this.checkState = CheckState.Unchecked;

                if (checkson)
                {
                    for (int i = 0; i < this.ObjLst.Count; i++)
                        this.ObjLst[i].SetCheckStatus(false, false, checkson);
                    for (int i = 0; i < this.AttrLst.Count; i++)
                        this.AttrLst[i].SetCheckStatus(false, false, checkson);
                }

                if (checkparent)
                {
                    ProObject pnode = this.ParentObj;
                    while (pnode != null)
                    {
                        pnode.checkState = CheckState.Unchecked;

                        //检查子类对象中是否有选中的
                        for (int j = 0; j < pnode.ObjLst.Count; j++)
                        {
                            if (pnode.ObjLst[j].checkState == CheckState.Checked)
                            {
                                pnode.checkState = CheckState.Checked;
                                break;
                            }
                        }


                        //检查属性列表中是否有选中的
                        if (pnode.checkState == CheckState.Unchecked)
                        {
                            for (int j = 0; j < pnode.AttrLst.Count; j++)
                            {
                                if (pnode.AttrLst[j].checkState == CheckState.Checked)
                                {
                                    pnode.checkState = CheckState.Checked;
                                    break;
                                }
                            }
                        }

                        pnode = pnode.ParentObj;
                    }
                }
            }
        }

        //private static Dictionary<string, ProObject> TableToList(DataTable dt)
        //{
        //    return TableToList(dt, true);
        //}

        /// <summary>
        /// 数据集转对象
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="bgetattr">是否获取其包含的属性</param>
        /// <param name="sVisible"></param>
        /// <returns></returns>
        //private static Dictionary<string, ProObject> TableToList(DataTable dt, bool bgetattr)
        //{
        //    if (OjbGroupLst == null)
        //        OjbGroupLst = new List<string>();
        //    OjbGroupLst.Clear();

        //    string lantype = PtlConsts.LanType == "cn" ? "" : PtlConsts.LanType; 
        //    Dictionary<string, ProObject> list = new Dictionary<string, ProObject>();
        //    if (dt == null)
        //        return list;
        //    ProObject m = null;
        //    foreach (DataRow dr in dt.Rows)
        //    {
        //        m = new ProObject();

        //        m.ID = dr["ID"].ToString();
        //        m.PID = dr["PID"].ToString();
        //        m.OBIS = dr["OBIS"].ToString();


        //        m.BaseObName = dr["ObName"].ToString();

        //        m.BaseDescs = dr["Descs"].ToString();


        //        m.ObName = dr[lantype + "ObName"].ToString();
        //        if (string.IsNullOrEmpty(m.ObName))
        //            m.ObName = m.BaseObName;
        //        m.Descs = dr[lantype  + "Descs"].ToString();
        //        if (string.IsNullOrEmpty(m.Descs))
        //            m.Descs = m.BaseDescs;
        //        try
        //        {
        //            m.NodeType = (ObjType)(Convert.ToInt16(dr["NodeType"].ToString()));
        //        }
        //        catch
        //        { }
        //        string ClassID = dr["ClassID"].ToString();
        //        if (m.NodeType == ObjType.对象)
        //            m.proClass = ProIClass.GetClassByID(ClassID, dr["Version"].ToString());//根据类编号找到接口类

        //        m.IfParent = dr["IfParent"].ToString() == "1";

        //        if (bgetattr)
        //            m.AttrLst = ProObAttr.GetAttrByObject(m);
        //        m.seq = dr["seq"].ToString();
        //        try
        //        {
        //            m.ObjGroup = dr["ObjGroup"].ToString();                   
        //        }
        //        catch
        //        { }
        //        if (!string.IsNullOrEmpty(m.ObjGroup))
        //            AddObjGroup(m.ObjGroup.Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries));

        //        m.ifInteroir = dr["IfInteroir"].ToString();
        //        m.ifStandard = dr["IfStandard"].ToString();

        //        try
        //        {
        //            string mhas = dr["MeterHas"].ToString();

        //            if (!string.IsNullOrEmpty(mhas))
        //                m.meterhas = int.Parse(mhas);
        //        }
        //        catch
        //        { }

        //        list.Add(m.ID, m);                
        //    }
        //    return list;
        //}

        //获取数据库中的所有对象
        //private static Dictionary<string, ProObject> GetAllObject()
        //{
        //    //先升级一把
        //    //string errinfo = string.Empty;
        //    //Upgrade(ref errinfo);           


        //    //先获取所有属性
        //    ProObAttr.GetAllAttr();
        //    PtlConsts.easyDb.Clear();
        //    PtlConsts.easyDb.SetSQLText("Select distinct * From T_Objects left join t_objects_lang on (T_Objects.id=t_objects_lang.Objid) order by seq"); 
        //    //PtlConsts.easyDb.TableName = "T_Objects a,T_Objects_lang b";
        //    //PtlConsts.easyDb.SetRelateFieldParameter(true, "a.ID", "=", "b.id");
        //    //PtlConsts.easyDb.SetOrder("seq");
        //    dtAll = PtlConsts.easyDb.Select();
        //    Objectlst = ProObject.TableToList(dtAll);

        //    return Objectlst;
        //}

        /// <summary>
        /// 获取所有数据的集合
        /// </summary>
        /// <returns></returns>
        //public static DataTable GetObjectDateTable()
        //{
        //    if (dtAll == null)
        //        GetAllObject();
        //    return dtAll;
        //}

        //获取已处理了上下级关系的对象列表
        public static List<ProObject> GetTreeObjLst()
        {
            return GetTreeObjLst(true);
        }

        private static Dictionary<string, ProObject> TableToList(List<Wasion.HHU.Data.Models.VObjects> vos, bool bgetattr)
        {
            if (OjbGroupLst == null)
                OjbGroupLst = new List<string>();
            OjbGroupLst.Clear();

            string lantype = PtlConsts.LanType == "cn" ? "" : PtlConsts.LanType;
            Dictionary<string, ProObject> list = new Dictionary<string, ProObject>();
            if (vos == null)
                return list;
            ProObject m = null;
            foreach (Wasion.HHU.Data.Models.VObjects vo in vos)
            {
                m = new ProObject();

                m.ID = vo.ID;
                m.PID = vo.PID;
                m.OBIS = vo.OBIS;


                m.BaseObName = vo.ObName;

                m.BaseDescs = vo.Descs;


                m.ObName = vo.ObName;//lantype语言选择
                if (string.IsNullOrEmpty(m.ObName))
                    m.ObName = m.BaseObName;
                m.Descs = vo.Descs;//lantype语言选择
                if (string.IsNullOrEmpty(m.Descs))
                    m.Descs = m.BaseDescs;
                try
                {
                    m.NodeType = (ObjType)(Convert.ToInt16(vo.NodeType));
                }
                catch
                { }
                string ClassID = vo.ClassID;
                if (m.NodeType == ObjType.对象)
                    m.proClass = ProIClass.GetClassByID(ClassID, vo.Version);//根据类编号找到接口类

                m.IfParent = vo.IfParent == 1;

                if (bgetattr)
                    m.AttrLst = ProObAttr.GetAttrByObject(m);
                m.seq = vo.Seq.ToString();
                try
                {
                    m.ObjGroup = vo.ObjGroup;
                }
                catch
                { }
                if (!string.IsNullOrEmpty(m.ObjGroup))
                    AddObjGroup(m.ObjGroup.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries));

                m.ifInteroir = vo.IfInteroir.ToString();
                m.ifStandard = vo.IfStandard.ToString();

                try
                {
                    string mhas = vo.MeterHas.ToString();

                    if (!string.IsNullOrEmpty(mhas))
                        m.meterhas = int.Parse(mhas);
                }
                catch
                { }

                list.Add(m.ID, m);
            }
            return list;
        }

        //获取已处理了上下级关系的对象列表
        public static List<ProObject> GetTreeObjLst(bool reload)
        {
            if (reload)
            {
                //GetAllObject();
                ProObAttr.GetAllAttr();
                Wasion.HHU.Data.Repositories.VObjectsDbRepository vobjSrv = new Wasion.HHU.Data.Repositories.VObjectsDbRepository();
                var voList = vobjSrv.GetAllList().Result;

                Objectlst = TableToList(voList, true);
            }
            List<ProObject> ObjTreelst = new List<ProObject>();

            ProObject rootobj = new ProObject();
            rootobj.ObName = "所有对象";
            rootobj.BaseObName = rootobj.ObName;
            rootobj.ObjLst = new List<ProObject>();
            rootobj.NodeType = ObjType.分类;
            rootobj.IfStandard = false;

            //for (int i = 0; i < Objectlst.Count; i++)
            //{
            //    if (Objectlst[i].PID == "0" || Objectlst[i].PID == "")
            //    {
            //        ProObject findobj = Objectlst[i];  //.Copy();
            //        //findobj.GetSonObj();
            //        findobj.ParentObj = rootobj;
            //        rootobj.ObjLst.Add(findobj);

            //    //    }
            //    //}


            //处理上下级关系
            foreach (string id in Objectlst.Keys)
            {
                ProObject findobj = Objectlst[id];
                if (!string.IsNullOrEmpty(findobj.PID) && findobj.PID != "0")  //有父节点的
                {
                    if (Objectlst.ContainsKey(findobj.PID))
                    {
                        Objectlst[findobj.PID].AddSon(findobj);
                        findobj.ParentObj = Objectlst[findobj.PID];
                    }
                }
                else
                    rootobj.AddSon(findobj);
            }

            rootobj.IfParent = true;
            ObjTreelst.Add(rootobj);
            return ObjTreelst;
        }


        //根据OID获取对应Object
        //public static ProObject GetObjectByOID(string sOBIS)
        //{
        //    ProObject proObject = null;
        //    if (Objectlst == null)
        //        GetAllObject();
        //    //for (int i = 0; i < Objectlst.Count; i++)
        //    foreach (string id in Objectlst.Keys)
        //    {
        //        if (Objectlst[id].OBIS == sOBIS)
        //        {
        //            proObject = Objectlst[id];
        //            break;
        //        }

        //    }
        //    return proObject;
        //}


        //hxh 根据obis ,类别号及类版本 获取对应Object
        //public static ProObject GetObjectByOBIS(string Classid,string version,string sOBIS)
        //{
        //    ProObject proObject = null;
        //    if (Objectlst == null)
        //        GetAllObject();
        //    foreach (string id in Objectlst.Keys)
        //    {
        //        if (Objectlst[id].OBIS == sOBIS && Objectlst[id].proClass.ClassID == Classid
        //            && Objectlst[id].proClass.Version == version)
        //        {
        //            proObject = Objectlst[id];
        //            break;
        //        }
        //    }
        //    return proObject;
        //}

        public static void GetObAttrLstDic(Dictionary<string, ProObAttr> DicItem, List<ProObject> ObjLst)
        {
            for (int i = 0; i < ObjLst.Count; i++)
            {
                ProObject obj = ObjLst[i];
                GetObAttrLstDic(DicItem, obj.AttrLst);
                GetObAttrLstDic(DicItem, obj.ObjLst);
            }

        }

        public static void GetObAttrLstDic(Dictionary<string, ProObAttr> DicItem, List<ProObAttr> AttrLst)
        {
            for (int i = 0; i < AttrLst.Count; i++)
            {
                if (!DicItem.ContainsKey(AttrLst[i].ID))
                    DicItem.Add(AttrLst[i].ID, AttrLst[i]);
                GetObAttrLstDic(DicItem, AttrLst[i].EleLst);
            }
        }

        //根据ID获取对应Object
        //public static ProObject GetObjectByID(string sid)
        //{
        //    ProObject proObject = null;
        //    if (Objectlst == null)
        //        GetAllObject();
        //    //for (int i = 0; i < Objectlst.Count; i++)
        //    foreach (string id in Objectlst.Keys)
        //    {
        //        if (Objectlst[id].ID == sid)
        //        {
        //            proObject = Objectlst[id];
        //            break;
        //        }

        //    }
        //    return proObject;
        //}

        //根据类ID获取对应Object
        //public static List<ProObject> GetObjectByclassID(string classid)
        //{
        //    List<ProObject> proObject = new List<ProObject>();
        //    if (Objectlst == null)
        //        GetAllObject();
        //    foreach (string id in Objectlst.Keys)
        //    {
        //        if (Objectlst[id].proClass.ClassID == classid)
        //        {
        //            proObject.Add(Objectlst[id]);
        //        }

        //    }
        //    return proObject;
        //}

        /// <summary>
        /// 获取新ID
        /// </summary>
        /// <returns></returns>
        public static string GetNewId()
        {
            return  Guid.NewGuid().ToString(); //PubFunc62056.GetNewId("T_Objects", "ID");

        }

        //public static int DeleteOID(string sID)
        //{
        //    PtlConsts.easyDb.Clear();
        //    PtlConsts.easyDb.TableName = ptltable;
        //    PtlConsts.easyDb.SetWhereParameter(true, "OI", "=", sID, EasyDataType.String);
        //    return PtlConsts.easyDb.Delete();
        //}

        /// <summary>
        /// 保存对象
        /// </summary>
        /// <param name="insertFlag">true时是插入增加,false更新</param>
        /// <returns></returns>
        //public int SaveObject(bool insertFlag, EasyDb tmpDB, ref string errinfo)
        //{
        //    if (tmpDB == null)
        //        tmpDB = PtlConsts.easyDb;
        //    tmpDB.Clear();
        //    tmpDB.TableName = ptltable;
        //    tmpDB.SetFieldValue("PID", PID, EasyDataType.String);
        //    tmpDB.SetFieldValue("ClassID", proClass.ID, EasyDataType.String);
        //    tmpDB.SetFieldValue("OBIS", OBIS, EasyDataType.String);


        //    if (!string.IsNullOrEmpty(PtlConsts.LanType))
        //    {
        //        BaseObName = string.IsNullOrEmpty(BaseObName) ? ProName : BaseObName;
        //        tmpDB.SetFieldValue("ObName", BaseObName, EasyDataType.String);               
        //        BaseDescs = string.IsNullOrEmpty(BaseDescs) ? Descs : BaseDescs;
        //        tmpDB.SetFieldValue("Descs", BaseDescs, EasyDataType.String);
        //    }           
        //    tmpDB.SetFieldValue("IfParent", IfParent ? "1" : "0", EasyDataType.Number);
            
        //    tmpDB.SetFieldValue("NodeType", Convert.ToString((int)NodeType), EasyDataType.String); //
        //    tmpDB.SetFieldValue("seq", seq, EasyDataType.Number);
        //    tmpDB.SetFieldValue("ObjGroup", ObjGroup, EasyDataType.String);

        //    tmpDB.SetFieldValue("IfInteroir", ifInteroir, EasyDataType.Number);
        //    tmpDB.SetFieldValue("IfStandard", ifStandard, EasyDataType.Number);
        //    tmpDB.SetFieldValue("MeterHas", meterhas.ToString(), EasyDataType.Number);
        //    int rs = 0;
        //    if (insertFlag)
        //    {
        //        tmpDB.SetFieldValue("ID", ID, EasyDataType.String);
        //        rs = tmpDB.Insert(ref errinfo);
        //        if (rs >= 0 && tmpDB == PtlConsts.easyDb)
        //        {
        //            Objectlst.Add(ID, this);
        //            if (this.ParentObj != null)
        //                this.ParentObj.AddSon(this);
        //        }
        //        else
        //            return rs;
        //       // return rs;
        //    }
        //    else
        //    {
        //        tmpDB.SetWhereParameter(true, "ID", "=", ID, EasyDataType.String);               
        //        rs = tmpDB.Update(ref errinfo);
        //        if (rs <= 0)
        //            return rs;
        //        //if (rs > 0)
        //        //  rs =  ProObAttr.UpdateAttrOBIS(OBIS); //更新属性表中的相关OBIS
        //      //  return rs;
        //    }

        //    rs = SaveObjLang(PtlConsts.LanType, ref errinfo);
        //    return rs;
        //}


        /// <summary>
        /// 保存多语言信息
        /// </summary>
        /// <param name="errinfo"></param>
        /// <returns></returns>
        //public int SaveObjLang(string lantype, ref string errinfo)
        //{
        //    int rs = 1;
        //    if (!string.IsNullOrEmpty(lantype) && lantype != "cn")
        //    {
        //        PtlConsts.easyDb.Clear();
        //        PtlConsts.easyDb.TableName = ptltable + "_Lang";
        //        PtlConsts.easyDb.SetFieldValue(lantype + "ObName", ProName, EasyDataType.String);
        //        PtlConsts.easyDb.SetFieldValue(lantype + "Descs", Descs, EasyDataType.String);
        //        PtlConsts.easyDb.SetFieldValue("ObjID", ID, EasyDataType.String);
        //        rs = PtlConsts.easyDb.Insert(ref errinfo);
        //        if (rs <= 0)
        //        {
        //            PtlConsts.easyDb.SetWhereParameter(true, "ObjID", "=", ID, EasyDataType.String);
        //            rs = PtlConsts.easyDb.Update(ref errinfo);
        //        }

        //    }
        //    return rs;
        //}

        //public int DeleteObjectByID(ref string errinfo) 
        //{
        //    if (string.IsNullOrEmpty(ID)) return 1;
        //    try
        //    {
        //        PtlConsts.easyDb.Clear();
        //        PtlConsts.easyDb.TableName = ptltable;
        //        PtlConsts.easyDb.SetWhereParameter(true, "ID", "=", ID, EasyDataType.String);
        //        int rs = PtlConsts.easyDb.Delete();                

        //        PtlConsts.easyDb.Clear();
        //        PtlConsts.easyDb.TableName = ptltable + "_Lang";
        //        PtlConsts.easyDb.SetWhereParameter(true, "ObjID", "=", ID, EasyDataType.String);
        //        rs = PtlConsts.easyDb.Delete();
        //        if (rs >= 0)
        //        {
        //            for (int i = ObjLst.Count - 1; i >= 0; i--)
        //                ObjLst[i].DeleteObjectByID(ref errinfo);  //删除该对象下面包含的对象
        //            for (int i = AttrLst.Count - 1; i >= 0; i--)
        //                AttrLst[i].DeleteObjectAttrByID(ref errinfo);  //删除该对象包含的属性
        //            this.Dispose();
        //        }
        //        return rs;
        //    }
        //    catch(Exception ex)
        //    {
        //        errinfo = ex.Message;
        //        return -1;
        //    }
        //}

        //public int DeleteObjectByOI(ref string errinfo)
        //{
        //    if (string.IsNullOrEmpty(OBIS)) return 1;
        //    try
        //    {
        //        PtlConsts.easyDb.Clear();
        //        PtlConsts.easyDb.TableName = ptltable;
        //        PtlConsts.easyDb.SetWhereParameter(true, "OBIS", "=", OBIS, EasyDataType.String);
        //        int rs = PtlConsts.easyDb.Delete(ref errinfo);
        //        if (rs >= 0)
        //            this.Dispose();
        //        return rs;
        //    }
        //    catch (Exception ex)
        //    {
        //        errinfo = ex.Message;
        //        return -1;
        //    }
        //}

        /// <summary>
        /// 删除某类下面的所有对象
        /// </summary>
        /// <returns></returns>
        //public int DeleteObjectByClass(ref string errinfo)
        //{
        //    if (string.IsNullOrEmpty(proClass.ClassID)) return 1;
        //    try
        //    {
        //        PtlConsts.easyDb.Clear();
        //        PtlConsts.easyDb.TableName = ptltable;
        //        PtlConsts.easyDb.SetWhereParameter(true, "ClassID", "=", proClass.ClassID, EasyDataType.String);
        //        int rs = PtlConsts.easyDb.Delete(ref errinfo);
        //        if (rs >= 0)
        //        {
        //            //for (int i = Objectlst.Count - 1; i >= 0; i--)
        //            foreach (string id in Objectlst.Keys)
        //                if (Objectlst[id].proClass.ClassID == proClass.ClassID)
        //                    Objectlst[id].Dispose();
        //        }
        //        return rs;
        //    }
        //    catch (Exception ex)
        //    {
        //        errinfo = ex.Message;
        //        return -1;
        //    }
        //}


        /// <summary>
        /// 清空原属性
        /// </summary>
        /// <param name="errinfo"></param>
        /// <returns></returns>
        //public int ClearAttrLst(ref string errinfo)
        //{
        //    int rs = 1;
        //    for (int i = AttrLst.Count - 1; i >= 0; i--)
        //    {
        //        rs = AttrLst[i].DeleteObjectAttrByID(ref errinfo);  //删除该对象包含的属性
        //        if (rs < 0)
        //            return rs;
        //    }
        //    AttrLst.Clear();
        //    return rs;
        //}

        /// <summary>
        /// 导入文件转换成对象
        /// </summary>
        /// <param name="dsImport"></param>
        /// <returns></returns>
        //public static List<ProObject> GetImportObjLst(DataSet dsImport)
        //{
        //    try
        //    {
        //        //先获取所有属性
        //        //ProObAttr.GetImportAttrLst(dsImport.Tables["T_ObAttrMth"]);
        //        PtlConsts.easyDb.Clear();
        //        PtlConsts.easyDb.TableName = ptltable;
        //        PtlConsts.easyDb.SetOrder("ID");
        //        Objectlst = ProObject.TableToList(dsImport.Tables["T_Objects"]);

        //        List<ProObject> ObjTreelst = new List<ProObject>();

        //        ProObject rootobj = new ProObject();
        //        rootobj.ObName = clsLan.GetLan("所有对象");
        //        rootobj.ObjLst = new List<ProObject>();

        //        //for (int i = 0; i < Objectlst.Count; i++)
        //        foreach (string id in Objectlst.Keys)
        //        {
        //            if (Objectlst[id].PID == "0" || Objectlst[id].PID == "")
        //            {
        //                ProObject findobj = Objectlst[id];  //.Copy();

        //                rootobj.AddSon(findobj);
        //                //findobj.GetSonObj();

        //            }
        //        }
        //        ObjTreelst.Add(rootobj);
        //        return ObjTreelst;
        //    }
        //    catch
        //    {
        //        return null;
        //    }
        //}


        //public int UpdateSeq(int ObSeq) {
        //    PtlConsts.easyDb.Clear();
        //    PtlConsts.easyDb.TableName = ptltable;
        //    PtlConsts.easyDb.SetFieldValue("Seq", ObSeq.ToString(), EasyDataType.String);
        //    PtlConsts.easyDb.SetWhereParameter(true, "ID", "=", ID, EasyDataType.String);
        //    return PtlConsts.easyDb.Update();
        //}
        /// <summary>
        /// 导入对象本地验证
        /// </summary>
        /// <param name="m"></param>
        /// <returns>两位，第一位表示Object更新状态：0新增；1ID有变动更新；2ID无变动更新；3完全一致不更新。第二位属性方法更新0一致不更新，1不一致更新</returns>
        public string GetExistDBInfo(ref ProObject m)
        {
            try
            {
                string result = "0";
                //PtlConsts.easyDb.Clear();
                //PtlConsts.easyDb.TableName = ptltable;
                //PtlConsts.easyDb.SetWhereParameter(true, "ObName", "=", ObName, EasyDataType.String);
                //PtlConsts.easyDb.SetWhereParameter(true, "OI", "=", OI, EasyDataType.String);
                //DataTable dt = PtlConsts.easyDb.Select();
                //if (dt != null && dt.Rows.Count > 0)
                //{
                //    DataRow dr = dt.Rows[0];
                //    m.ID = dr["ID"].ToString();
                //    m.PID = dr["PID"].ToString();
                //    m.OI = dr["OI"].ToString();
                //    m.ObName = dr["ObName"].ToString();
                //    m.ClassID = dr["ClassID"].ToString();
                //    m.DataType = dr["DataType"].ToString();
                //    m.Units = dr["Units"].ToString();
                //    m.Scaler = dr["Scaler"].ToString();
                //    m.Descs = dr["Descs"].ToString();
                //    m.IfParent = dr["IfParent"].ToString() == "1";

                //    if (m.ID == ID)
                //    {
                //        if (m.ObName == ObName && m.ClassID == ClassID && m.DataType == DataType && m.Units == Units
                //        && m.Scaler == Scaler && m.Descs == Descs && m.IfParent == IfParent)
                //        {
                //            result = "3";
                //        }
                //        else
                //        {
                //            result = "2";
                //        }
                //    }
                //    else
                //    {
                //        if (OI == "")
                //        {
                //            int a = 0;
                //        }

                //        result = "1";
                //    }
                //    string attrFlag = "0";
                //    foreach (ProObAttr obattr in AttrLst)
                //    {
                //        if (!obattr.ImportIsDBInfo())
                //        {
                //            attrFlag = "1";
                //            break;
                //        }
                //    }
                //    result = result + attrFlag;
                //}
                //else
                //{
                //    result = "0";
                //}
                return result;
            }
            catch
            {
                return "0";
            }
        }

        public bool SaveImportObj(string mFlag)
        {
            try
            {
                //if (mFlag == "0")
                //{
                //    ID = PubFunc62056.GetNewId(ptltable, "ID");
                //    if (SaveObject(true, null) <= 0)
                //    {
                //        return false;
                //    }

                //    int iID = int.Parse(PubFunc62056.GetNewId("T_ObAttrMth", "ID"));
                //    foreach (ProObAttr obattr in AttrLst)
                //    {
                //        obattr.ID = iID.ToString();
                //        if (obattr.ImportSaveObjectAttr(true, null) <= 0)
                //        {
                //            return false;
                //        }
                //        iID++;
                //    }
                //    foreach (ProObject objson in ObjLst)
                //    {
                //        objson.PID = ID;
                //    }
                    
                //}
                //else
                //{
                //    if (mFlag.Substring(0, 1) == "1")
                //    {
                //        if (ImportSaveObject(false) <= 0)
                //        {
                //            return false;
                //        }

                //        for (int i = 0; i < ObjLst.Count; i++)
                //        {
                //            ProObject obj = ObjLst[i];
                //            obj.PID = ID;
                //        }
                //    }
                //    else if (mFlag.Substring(0, 1) == "2")
                //    {
                //        if (ImportSaveObject(false) <= 0)
                //        {
                //            return false;
                //        }
                //    }

                //    if (mFlag.Substring(1, 1) == "1")
                //    {
                //        PtlConsts.easyDb.Clear();
                //        PtlConsts.easyDb.TableName = "T_ObAttrMth";
                //        PtlConsts.easyDb.SetWhereParameter(true, "OI", "=", OI, EasyDataType.String);
                //        PtlConsts.easyDb.Delete();

                //        int iID = int.Parse(PubFunc62056.GetNewId("T_ObAttrMth", "ID"));
                //        for (int i = 0; i < AttrLst.Count; i++)
                //        {
                //            if (!ImportSaveAttr(AttrLst[i], ref iID))
                //            {
                //                return false;
                //            }

                //        }
                //    }

                //}
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

        private bool ImportSaveAttr(ProObAttr obattr, ref int iID)
        {
            obattr.ID = iID.ToString();
            //if (obattr.ImportSaveObjectAttr(true, null) <= 0)
            //{
            //    return false;
            //}
            int pid = iID;
            iID++;

            if (obattr.EleLst.Count > 0)
            {
                for (int i = 0; i < obattr.EleLst.Count; i++)
                {
                    ProObAttr proattr = obattr.EleLst[i];
                    proattr.PID = pid.ToString();
                    if (!ImportSaveAttr(proattr, ref iID))
                    {
                        return false;
                    }
                    iID++;
                }
            }
            return true;
        }

    //    /// <summary>
    //    /// 导入时保存对象
    //    /// </summary>
    //    /// <param name="insertFlag">true时是插入增加,false更新</param>
    //    /// <returns></returns>
    //    public int ImportSaveObject(bool insertFlag)
    //    {
    //        PtlConsts.easyDb.Clear();
    //        PtlConsts.easyDb.TableName = ptltable;
    //        PtlConsts.easyDb.SetFieldValue("PID", PID, EasyDataType.String);
    //        PtlConsts.easyDb.SetFieldValue("ClassID", ClassID, EasyDataType.String);
    //        PtlConsts.easyDb.SetFieldValue("OBIS", OBIS, EasyDataType.String);
    //        PtlConsts.easyDb.SetFieldValue("ObName", ObName, EasyDataType.String);
    //        PtlConsts.easyDb.SetFieldValue("Scaler", Scaler, EasyDataType.String);
    //        PtlConsts.easyDb.SetFieldValue("DataType", DataType, EasyDataType.String);
    //        PtlConsts.easyDb.SetFieldValue("Units", Units, EasyDataType.String);
    //        PtlConsts.easyDb.SetFieldValue("IfParent", IfParent ? "1" : "0", EasyDataType.String);
    //        PtlConsts.easyDb.SetFieldValue("Descs", Descs, EasyDataType.String);
    //        PtlConsts.easyDb.SetFieldValue("NodeType", Convert.ToString((int)NodeType), EasyDataType.String); //

    //        if (insertFlag)
    //        {
    //            PtlConsts.easyDb.SetFieldValue("ID", ID, EasyDataType.String);
    //            int rs = PtlConsts.easyDb.Insert();
    //            return rs;
    //        }
    //        else
    //        {
    //            PtlConsts.easyDb.SetWhereParameter(true, "ID", "=", ID, EasyDataType.String);
    //            return PtlConsts.easyDb.Update();
    //        }
    //    }

        /// <summary>
        /// 获取所有可选对象分组
        /// </summary>
        /// <returns></returns>
        public static List<string> GetObjGroupLst()
        {
            return OjbGroupLst;
        }


        /// <summary>
        /// 添加对象分组
        /// </summary>
        /// <param name="agroup"></param>
        public static void AddObjGroup(string[] agrouplst)
        {
            for (int i = 0; i < agrouplst.Length; i++)
                AddObjGroup(agrouplst[i]);
        }

        /// <summary>
        /// 添加对象分组
        /// </summary>
        /// <param name="agroup"></param>
        public static void AddObjGroup(string agroup)
        {
            if (string.IsNullOrEmpty(agroup))
                return;
            if (OjbGroupLst.IndexOf(agroup) < 0)
                OjbGroupLst.Add(agroup);
        }

        

        /// <summary>
        /// 根据15类抄读回来的对象列表更新数据库的对象列表,加入状态
        /// </summary>
        /// <param name="elelst"></param>
        //public static void RefreshObjLstByReadLst(List<ElementData> elelst)
        //{
        //    RemoveObjectByMeterHas(MeterHas.表有库缺);  //先移除库缺的部分
            
        //    SetObjectMeterHas(MeterHas.库有表缺);//把所有对象都设置为只数据库有的状态

        //    for (int e = 0; e < elelst.Count; e++)
        //    {
        //        //object_list_element ::= structure
        //        //{
        //        //class_id: long-unsigned,
        //        //version: unsigned,
        //        //logical_name: octet-string,
        //        //access_rights: access_right  //权限暂时不处理
        //        //}           
        //        string classid = elelst[e].eleNodeList[0].ReadValue;
        //        string version = elelst[e].eleNodeList[1].ReadValue;
        //        string sOBIS = elelst[e].eleNodeList[2].ReadValue;//OBIS
        //        ProObject obj = ProObject.GetObjectByOBIS(classid, version, sOBIS);
        //        if (obj == null)
        //        {
        //            obj = new ProObject();
        //            obj.ID = Guid.NewGuid().ToString();
        //            obj.proClass = ProIClass.GetByClassIDVersion(classid, version);
        //            obj.OBIS = sOBIS;
        //            obj.seq = (Objectlst.Count + 1).ToString();
        //            obj.NodeType = ObjType.对象;
        //            obj.meterHas = MeterHas.表有库缺;
        //            Objectlst.Add(obj.ID, obj);
        //        }
        //        else
        //        {
        //            obj.meterHas = MeterHas.表库都有;
        //        }
        //    }
        //    //SaveObjMeterHas();   shaungwang 暂不保存         
        //}


        /// <summary>
        /// 根据对象的表和数据库里是否存在标志移除
        /// </summary>
        /// <param name="mhas"></param>
        /// <returns></returns>
        //public static void RemoveObjectByMeterHas(MeterHas mhas)
        //{
        //    if (Objectlst == null)
        //        GetAllObject();

        //    List<string> keylst = new List<string>();
        //    foreach (string id in Objectlst.Keys)
        //    {
        //        if (Objectlst[id].meterHas == mhas) 
        //            keylst.Add(id);
        //    }

        //    for (int i = 0; i < keylst.Count; i++)
        //        Objectlst.Remove(keylst[i]);
        //}

        /// <summary>
        /// 设置所有对象的表和数据库里是否存在标志
        /// </summary>
        /// <param name="mhas"></param>
        /// <returns></returns>
        //public static void SetObjectMeterHas(MeterHas mhas)
        //{
        //    if (Objectlst == null)
        //        GetAllObject();

        //    foreach (string id in Objectlst.Keys)
        //        Objectlst[id].meterHas = mhas;
        //}

        //private static void SaveObjMeterHas()
        //{
        //    int iresult = 0;
        //    PtlConsts.easyDb.BeginTrans();
        //    foreach(string id in Objectlst.Keys){
        //        PtlConsts.easyDb.Clear();
        //        PtlConsts.easyDb.TableName = ptltable;
        //        PtlConsts.easyDb.SetFieldValue("MeterHas", Objectlst[id].meterhas.ToString(), EasyDataType.String);
        //        if (Objectlst[id].meterHas != MeterHas.表有库缺)
        //        {                    
        //            PtlConsts.easyDb.SetWhereParameter(true, "id", "=", Objectlst[id].ID, EasyDataType.String);
        //            iresult = PtlConsts.easyDb.Update();
        //        }
        //        else
        //        {
        //            PtlConsts.easyDb.SetFieldValue("id", Objectlst[id].ID, EasyDataType.String);
        //            PtlConsts.easyDb.SetFieldValue("seq", Objectlst[id].seq, EasyDataType.String);
        //            PtlConsts.easyDb.SetFieldValue("OBIS", Objectlst[id].OBIS, EasyDataType.String);
        //            PtlConsts.easyDb.SetFieldValue("ClassID", Objectlst[id].proClass.ID, EasyDataType.String);
        //            PtlConsts.easyDb.SetFieldValue("Version", Objectlst[id].proClass.Version, EasyDataType.String);
        //            PtlConsts.easyDb.SetFieldValue("NodeType", ((int)Objectlst[id].NodeType).ToString(), EasyDataType.String);
        //            iresult = PtlConsts.easyDb.Insert();
        //        }
        //    }
        //    PtlConsts.easyDb.CommitTrans();
        //}
    }

}
